/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package it.apuliait.model;

import com.liferay.portal.kernel.bean.AutoEscapeBeanHandler;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.ProxyUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.model.BaseModel;
import com.liferay.portal.model.impl.BaseModelImpl;

import it.apuliait.service.ClpSerializer;
import it.apuliait.service.TrasportoDocumentoLocalServiceUtil;

import java.io.Serializable;

import java.lang.reflect.Method;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Donatello
 */
public class TrasportoDocumentoClp extends BaseModelImpl<TrasportoDocumento>
	implements TrasportoDocumento {
	public TrasportoDocumentoClp() {
	}

	@Override
	public Class<?> getModelClass() {
		return TrasportoDocumento.class;
	}

	@Override
	public String getModelClassName() {
		return TrasportoDocumento.class.getName();
	}

	@Override
	public long getPrimaryKey() {
		return _trasportoId;
	}

	@Override
	public void setPrimaryKey(long primaryKey) {
		setTrasportoId(primaryKey);
	}

	@Override
	public Serializable getPrimaryKeyObj() {
		return _trasportoId;
	}

	@Override
	public void setPrimaryKeyObj(Serializable primaryKeyObj) {
		setPrimaryKey(((Long)primaryKeyObj).longValue());
	}

	@Override
	public Map<String, Object> getModelAttributes() {
		Map<String, Object> attributes = new HashMap<String, Object>();

		attributes.put("trasportoId", getTrasportoId());
		attributes.put("numeroTrasporto", getNumeroTrasporto());
		attributes.put("dataTrasporto", getDataTrasporto());
		attributes.put("lineaFatturaIDFK", getLineaFatturaIDFK());
		attributes.put("documentoIDFK", getDocumentoIDFK());

		return attributes;
	}

	@Override
	public void setModelAttributes(Map<String, Object> attributes) {
		Long trasportoId = (Long)attributes.get("trasportoId");

		if (trasportoId != null) {
			setTrasportoId(trasportoId);
		}

		String numeroTrasporto = (String)attributes.get("numeroTrasporto");

		if (numeroTrasporto != null) {
			setNumeroTrasporto(numeroTrasporto);
		}

		String dataTrasporto = (String)attributes.get("dataTrasporto");

		if (dataTrasporto != null) {
			setDataTrasporto(dataTrasporto);
		}

		Long lineaFatturaIDFK = (Long)attributes.get("lineaFatturaIDFK");

		if (lineaFatturaIDFK != null) {
			setLineaFatturaIDFK(lineaFatturaIDFK);
		}

		Long documentoIDFK = (Long)attributes.get("documentoIDFK");

		if (documentoIDFK != null) {
			setDocumentoIDFK(documentoIDFK);
		}
	}

	@Override
	public long getTrasportoId() {
		return _trasportoId;
	}

	@Override
	public void setTrasportoId(long trasportoId) {
		_trasportoId = trasportoId;

		if (_trasportoDocumentoRemoteModel != null) {
			try {
				Class<?> clazz = _trasportoDocumentoRemoteModel.getClass();

				Method method = clazz.getMethod("setTrasportoId", long.class);

				method.invoke(_trasportoDocumentoRemoteModel, trasportoId);
			}
			catch (Exception e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	@Override
	public String getNumeroTrasporto() {
		return _numeroTrasporto;
	}

	@Override
	public void setNumeroTrasporto(String numeroTrasporto) {
		_numeroTrasporto = numeroTrasporto;

		if (_trasportoDocumentoRemoteModel != null) {
			try {
				Class<?> clazz = _trasportoDocumentoRemoteModel.getClass();

				Method method = clazz.getMethod("setNumeroTrasporto",
						String.class);

				method.invoke(_trasportoDocumentoRemoteModel, numeroTrasporto);
			}
			catch (Exception e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	@Override
	public String getDataTrasporto() {
		return _dataTrasporto;
	}

	@Override
	public void setDataTrasporto(String dataTrasporto) {
		_dataTrasporto = dataTrasporto;

		if (_trasportoDocumentoRemoteModel != null) {
			try {
				Class<?> clazz = _trasportoDocumentoRemoteModel.getClass();

				Method method = clazz.getMethod("setDataTrasporto", String.class);

				method.invoke(_trasportoDocumentoRemoteModel, dataTrasporto);
			}
			catch (Exception e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	@Override
	public long getLineaFatturaIDFK() {
		return _lineaFatturaIDFK;
	}

	@Override
	public void setLineaFatturaIDFK(long lineaFatturaIDFK) {
		_lineaFatturaIDFK = lineaFatturaIDFK;

		if (_trasportoDocumentoRemoteModel != null) {
			try {
				Class<?> clazz = _trasportoDocumentoRemoteModel.getClass();

				Method method = clazz.getMethod("setLineaFatturaIDFK",
						long.class);

				method.invoke(_trasportoDocumentoRemoteModel, lineaFatturaIDFK);
			}
			catch (Exception e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	@Override
	public long getDocumentoIDFK() {
		return _documentoIDFK;
	}

	@Override
	public void setDocumentoIDFK(long documentoIDFK) {
		_documentoIDFK = documentoIDFK;

		if (_trasportoDocumentoRemoteModel != null) {
			try {
				Class<?> clazz = _trasportoDocumentoRemoteModel.getClass();

				Method method = clazz.getMethod("setDocumentoIDFK", long.class);

				method.invoke(_trasportoDocumentoRemoteModel, documentoIDFK);
			}
			catch (Exception e) {
				throw new UnsupportedOperationException(e);
			}
		}
	}

	public BaseModel<?> getTrasportoDocumentoRemoteModel() {
		return _trasportoDocumentoRemoteModel;
	}

	public void setTrasportoDocumentoRemoteModel(
		BaseModel<?> trasportoDocumentoRemoteModel) {
		_trasportoDocumentoRemoteModel = trasportoDocumentoRemoteModel;
	}

	public Object invokeOnRemoteModel(String methodName,
		Class<?>[] parameterTypes, Object[] parameterValues)
		throws Exception {
		Object[] remoteParameterValues = new Object[parameterValues.length];

		for (int i = 0; i < parameterValues.length; i++) {
			if (parameterValues[i] != null) {
				remoteParameterValues[i] = ClpSerializer.translateInput(parameterValues[i]);
			}
		}

		Class<?> remoteModelClass = _trasportoDocumentoRemoteModel.getClass();

		ClassLoader remoteModelClassLoader = remoteModelClass.getClassLoader();

		Class<?>[] remoteParameterTypes = new Class[parameterTypes.length];

		for (int i = 0; i < parameterTypes.length; i++) {
			if (parameterTypes[i].isPrimitive()) {
				remoteParameterTypes[i] = parameterTypes[i];
			}
			else {
				String parameterTypeName = parameterTypes[i].getName();

				remoteParameterTypes[i] = remoteModelClassLoader.loadClass(parameterTypeName);
			}
		}

		Method method = remoteModelClass.getMethod(methodName,
				remoteParameterTypes);

		Object returnValue = method.invoke(_trasportoDocumentoRemoteModel,
				remoteParameterValues);

		if (returnValue != null) {
			returnValue = ClpSerializer.translateOutput(returnValue);
		}

		return returnValue;
	}

	@Override
	public void persist() throws SystemException {
		if (this.isNew()) {
			TrasportoDocumentoLocalServiceUtil.addTrasportoDocumento(this);
		}
		else {
			TrasportoDocumentoLocalServiceUtil.updateTrasportoDocumento(this);
		}
	}

	@Override
	public TrasportoDocumento toEscapedModel() {
		return (TrasportoDocumento)ProxyUtil.newProxyInstance(TrasportoDocumento.class.getClassLoader(),
			new Class[] { TrasportoDocumento.class },
			new AutoEscapeBeanHandler(this));
	}

	@Override
	public Object clone() {
		TrasportoDocumentoClp clone = new TrasportoDocumentoClp();

		clone.setTrasportoId(getTrasportoId());
		clone.setNumeroTrasporto(getNumeroTrasporto());
		clone.setDataTrasporto(getDataTrasporto());
		clone.setLineaFatturaIDFK(getLineaFatturaIDFK());
		clone.setDocumentoIDFK(getDocumentoIDFK());

		return clone;
	}

	@Override
	public int compareTo(TrasportoDocumento trasportoDocumento) {
		long primaryKey = trasportoDocumento.getPrimaryKey();

		if (getPrimaryKey() < primaryKey) {
			return -1;
		}
		else if (getPrimaryKey() > primaryKey) {
			return 1;
		}
		else {
			return 0;
		}
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}

		if (!(obj instanceof TrasportoDocumentoClp)) {
			return false;
		}

		TrasportoDocumentoClp trasportoDocumento = (TrasportoDocumentoClp)obj;

		long primaryKey = trasportoDocumento.getPrimaryKey();

		if (getPrimaryKey() == primaryKey) {
			return true;
		}
		else {
			return false;
		}
	}

	@Override
	public int hashCode() {
		return (int)getPrimaryKey();
	}

	@Override
	public String toString() {
		StringBundler sb = new StringBundler(11);

		sb.append("{trasportoId=");
		sb.append(getTrasportoId());
		sb.append(", numeroTrasporto=");
		sb.append(getNumeroTrasporto());
		sb.append(", dataTrasporto=");
		sb.append(getDataTrasporto());
		sb.append(", lineaFatturaIDFK=");
		sb.append(getLineaFatturaIDFK());
		sb.append(", documentoIDFK=");
		sb.append(getDocumentoIDFK());
		sb.append("}");

		return sb.toString();
	}

	@Override
	public String toXmlString() {
		StringBundler sb = new StringBundler(19);

		sb.append("<model><model-name>");
		sb.append("it.apuliait.model.TrasportoDocumento");
		sb.append("</model-name>");

		sb.append(
			"<column><column-name>trasportoId</column-name><column-value><![CDATA[");
		sb.append(getTrasportoId());
		sb.append("]]></column-value></column>");
		sb.append(
			"<column><column-name>numeroTrasporto</column-name><column-value><![CDATA[");
		sb.append(getNumeroTrasporto());
		sb.append("]]></column-value></column>");
		sb.append(
			"<column><column-name>dataTrasporto</column-name><column-value><![CDATA[");
		sb.append(getDataTrasporto());
		sb.append("]]></column-value></column>");
		sb.append(
			"<column><column-name>lineaFatturaIDFK</column-name><column-value><![CDATA[");
		sb.append(getLineaFatturaIDFK());
		sb.append("]]></column-value></column>");
		sb.append(
			"<column><column-name>documentoIDFK</column-name><column-value><![CDATA[");
		sb.append(getDocumentoIDFK());
		sb.append("]]></column-value></column>");

		sb.append("</model>");

		return sb.toString();
	}

	private long _trasportoId;
	private String _numeroTrasporto;
	private String _dataTrasporto;
	private long _lineaFatturaIDFK;
	private long _documentoIDFK;
	private BaseModel<?> _trasportoDocumentoRemoteModel;
}